import 'dart:convert';

import 'package:shared_preferences/shared_preferences.dart';

class StorageUtil {
  StorageUtil._private();
  static Future<void> set(String key, dynamic value) async {
    SharedPreferences sp = await SharedPreferences.getInstance();
    String type;
    // 监测value的类型 如果是Map和List,则转换成JSON，以字符串进行存储
    if (value is Map || value is List) {
      type = 'String';
      value = JsonEncoder().convert(value);
    } else {
      type = value.runtimeType.toString();
    }
    // 根据value不同的类型 用不同的方法进行存储
    switch (type) {
      case 'String':
        sp.setString(key, value);
        break;
      case 'int':
        sp.setInt(key, value);
        break;
      case 'double':
        sp.setDouble(key, value);
        break;
      case 'bool':
        sp.setBool(key, value);
        break;
      default:
        throw Exception("value($value) format NOT support!");
    }
  }

  static Future<dynamic> get(String key) async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    // 获取key对应的value
    dynamic value = prefs.get(key);
    // 判断value是不是一个json的字符串 是 则解码
    if (_isJson(value)) {
      return JsonDecoder().convert(value);
    } else {
      // 不是 则直接返回
      return value;
    }
  }

  // 判断是否是JSON字符串
  static _isJson(dynamic value) {
    try {
      // 如果value是一个json的字符串 则不会报错 返回true
      JsonDecoder().convert(value);
      return true;
    } catch (e) {
      // 如果value不是json的字符串 则报错 进入catch 返回false
      return false;
    }
  }
}
